﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace KATAJAVI_SIA
{
    public partial class EditarAtenciones : Form
    {
        KATAJAVI call = new KATAJAVI();
        DataClassesDataContext BEDE = new DataClassesDataContext();
        IEnumerable<ATENCION> lista;
        DateTime fecha;

        public EditarAtenciones()
        {
            InitializeComponent();
        }


        private void NoVacios()
        {
            if (dgv_AtencionLista.RowCount == 0)
            {
                btn_BuscarAtencion.Enabled = false;
                btn_CargarRegistro.Enabled = false;
                btn_EliminarRegistro.Enabled = false;
                btn_NoHacerCambios.Enabled = false;
                btn_GuardarCambios.Enabled = false;
                tbx_BusquedaDato.Enabled = false;
            }
        }
        private void Limpiar()
        {
            tbx_AtencionCod.Clear();
            tbx_AtencionCod.Enabled = false;
            tbx_AtencionFechaIngreso.Clear();
            tbx_AtencionFechaIngreso.Enabled = false;
            tbx_AtencionMecanico.Clear();
            tbx_AtencionMecanico.Enabled = false;
            tbx_AtencionPatente.Clear();
            tbx_AtencionPatente.Enabled = false;
            tbx_AtencionDueno.Clear();
            tbx_AtencionDueno.Enabled = false;
            cbx_AtencionEstado.SelectedIndex = -1;
            cbx_AtencionEstado.Enabled = false;
            tbx_AtencionDescripcion.Clear();
            tbx_AtencionDescripcion.Enabled = false;
            tbx_AtencionMecanicoClave.Enabled = false;
            tbx_AtencionMecanicoClave.Clear();
            btn_GuardarCambios.Enabled = false;
            btn_NoHacerCambios.Enabled = false;
        }

        private void Llenar()
        {
            lista = BEDE.ATENCION.Where(a => a.softdelete == 1).OrderBy(a => a.cod_atencion);
            foreach (ATENCION aux in lista)
            {
                MOTO aa = BEDE.MOTO.Where(a => a.id_motocicleta == aux.id_motocicleta).First();
                MECANICO worker = BEDE.MECANICO.Where(a => a.rut_mecanico == aux.rut_mecanico).First();
                dgv_AtencionLista.Rows.Add(aux.cod_atencion.ToString(), aa.patente.ToString(), worker.Nombre, aux.fecha_ingreso.ToString());
            }
            btn_CargarRegistro.Enabled = true;
            btn_EliminarRegistro.Enabled = true;
        }

        private int FiltrarGrid(string buscado)
        {
            dgv_AtencionLista.Rows.Clear();
            lista = BEDE.ATENCION.Where(a => a.softdelete == 1).OrderBy(a => a.cod_atencion);
            int aa = 0;
            foreach (ATENCION aux in lista)
            {
                if (aux.cod_atencion.ToString().Contains(buscado) | aux.MOTO.patente.Contains(buscado) | aux.CLIENTE.rut_cliente.ToString().Contains(buscado) | aux.CLIENTE.nombre.Contains(buscado) | aux.MECANICO.Nombre.Contains(buscado))
                {
                    MOTO aas = BEDE.MOTO.Where(a => a.id_motocicleta == aux.id_motocicleta).First();
                    MECANICO worker = BEDE.MECANICO.Where(a => a.rut_mecanico == aux.rut_mecanico).First();
                    dgv_AtencionLista.Rows.Add(aux.cod_atencion.ToString(), aas.patente.ToString(), worker.Nombre, aux.fecha_ingreso.ToString()); 
                    aa++;
                }
            }
            if (aa == 0) { return 0; }
            else { return 1; }
        }

        private void EditarAtenciones_Load(object sender, EventArgs e)
        {
            Llenar();
            cbx_AtencionEstado.DataSource = BEDE.ESTADO_ATENCION;
            cbx_AtencionEstado.ValueMember = "id_estado";
            cbx_AtencionEstado.DisplayMember = "NombreEstado";
            tbx_AtencionMecanicoClave.PasswordChar = '•';
            cbx_AtencionEstado.SelectedIndex = -1;
            NoVacios();
        }

        private void btn_BuscarAtencion_Click(object sender, EventArgs e)
        {
            if (tbx_BusquedaDato.Text.Length >= 3)
            {
                tbx_BusquedaDato.Text = tbx_BusquedaDato.Text.Trim();
                int a = call.BuscarEnGrid(tbx_BusquedaDato.Text, dgv_AtencionLista);
                if (a == 0)
                {
                    int b = FiltrarGrid(tbx_BusquedaDato.Text.Trim());
                    if (b == 0)
                    {
                        MessageBox.Show("No se encontro ninguna atención asociada al dato indicado.", "RESULTADO DE LA BUSQUEDA", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        NoVacios();
                        tbx_BusquedaDato.Enabled = true;
                        btn_BuscarAtencion.Enabled = true;
                    }
                    else { MessageBox.Show("No se encontró un resultado preciso. Se filtraron los registros, usando la cadena indicada como referencia.", "BUSQUEDA FILTRADA.", MessageBoxButtons.OK, MessageBoxIcon.Information); }
                }
            }
            else
            {
                if (tbx_BusquedaDato.Text == "") { errorProvider1.SetError(tbx_BusquedaDato, "Ingrese un dato para iniciar la búsqueda."); }
                else { errorProvider1.SetError(tbx_BusquedaDato, "El texto ingresado es muy corto para una búsqueda efectiva.\n(Se requieren mínimo 3 caracteres para la busqueda)."); }
            }
        }

        private void btn_CargarRegistro_Click(object sender, EventArgs e)
        {
            lista = BEDE.ATENCION;
            string idatencion = dgv_AtencionLista.CurrentRow.Cells[0].Value.ToString();
            foreach (ATENCION aux in lista)
            {
                if (aux.cod_atencion == int.Parse(idatencion))
                {
                    if (aux.estado_atencion != 4)
                    {
                        CLIENTE owner = BEDE.CLIENTE.Where(a => a.rut_cliente == aux.rut_cliente).First();
                        tbx_AtencionCod.Text = aux.cod_atencion.ToString();
                        tbx_AtencionCod.Enabled = true;
                        tbx_AtencionFechaIngreso.Text = aux.fecha_ingreso.Day.ToString() + "/" + aux.fecha_ingreso.Month.ToString() + "/" + aux.fecha_ingreso.Year.ToString();
                        tbx_AtencionFechaIngreso.Enabled = true;
                        tbx_AtencionMecanico.Text = aux.MECANICO.Nombre;
                        tbx_AtencionMecanico.Enabled = true;
                        tbx_AtencionPatente.Text = aux.MOTO.patente;
                        tbx_AtencionPatente.Enabled = true;
                        tbx_AtencionDueno.Text = owner.nombre;
                        tbx_AtencionDueno.Enabled = true;
                        cbx_AtencionEstado.SelectedIndex = aux.estado_atencion;
                        cbx_AtencionEstado.Enabled = true;
                        tbx_AtencionDescripcion.Text = aux.descripcion_ingreso;
                        tbx_AtencionDescripcion.Enabled = true;
                        tbx_AtencionMecanicoClave.Enabled = true;
                        btn_GuardarCambios.Enabled = true;
                        btn_NoHacerCambios.Enabled = true;
                    }
                    else { MessageBox.Show("No se puede cargar el registro al editor, pues el sistema no permite modificar la información de atenciones ya finiquitadas.\nCorrobore la información de la atención que desea modificar, en el formulario de CONSULTA DE ATENCIONES.", "ERROR AL CARGAR EL REGISTRO.", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); }
                 }

            }
        }

        private void btn_NoHacerCambios_Click(object sender, EventArgs e)
        {
            Limpiar();
        }

        private void btn_EliminarRegistro_Click(object sender, EventArgs e)
        {

            lista = BEDE.ATENCION;
            string codatencion = dgv_AtencionLista.CurrentRow.Cells[0].Value.ToString();
            foreach (ATENCION aux in lista)
            {
                if (aux.cod_atencion == int.Parse(codatencion))
                {
                    if (aux.estado_atencion == 4)
                    {
                        if (MessageBox.Show("¿Esta seguro que desea eliminar el\nregistro seleccionado?.", "ELIMINAR REGISTRO.", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                        {
                            aux.softdelete = 0;
                            BEDE.SubmitChanges();
                            dgv_AtencionLista.Rows.Clear();
                            Llenar();
                            MessageBox.Show("La atención ha sido eliminada correctamente del sistema.", "REGISTRO ELIMINADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            NoVacios();
                        }
                    }
                    else
                    {
                        MessageBox.Show("La ATENCIÓN no puede eliminarse, pues aun se encuentra pendiente.", "ERROR AL ELIMINAR REGISTRO.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void btn_GuardarCambios_Click(object sender, EventArgs e)
        {
            try
            {
                tbx_AtencionDescripcion.Text = tbx_AtencionDescripcion.Text.Trim();
                if (tbx_AtencionMecanicoClave.Text == "")
                {
                    MessageBox.Show("No se puede actualizar el registro mientras no se ingrese la clave del mecánico encargado de esta atención. Por favor ingrese la clave para poder guardar los cambios.", "ERROR AL INTENTAR GUARDAR.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    MECANICO Mecanico = (from c in BEDE.MECANICO where c.Nombre == tbx_AtencionMecanico.Text select c).First();
                    int sw = call.ValidarClaveMecanico(Mecanico.rut_mecanico, int.Parse(tbx_AtencionMecanicoClave.Text));
                    if (sw == 0)
                    {
                    MessageBox.Show("No se puede actualizar el registro seleccionado, porque la clave ingresada no corresponde al mecánico que inició dicha atención.\nPor favor corrija la clave, y vuelva a intentarlo.", "ERROR AL INTENTAR GUARDAR.", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    tbx_AtencionMecanicoClave.Focus();
                    tbx_AtencionMecanicoClave.SelectAll();
                    }
                    if (sw == 1)
                    {
                        if (MessageBox.Show("¿Esta seguro que desea guardar los cambios\nrealizados al registro?.", "EDITAR REGISTRO.", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                        {
                            ATENCION AtenciónExistente = (from c in BEDE.ATENCION where c.cod_atencion == int.Parse(tbx_AtencionCod.Text) select c).First();
                            AtenciónExistente.descripcion_ingreso = tbx_AtencionDescripcion.Text;
                            ESTADO_ATENCION estado = BEDE.ESTADO_ATENCION.First(es => es.id_estado == int.Parse(cbx_AtencionEstado.SelectedValue.ToString()));
                            AtenciónExistente.estado_atencion = estado.id_estado;
                            if (estado.id_estado == 4) 
                            { 
                                fecha = DateTime.Now;
                                AtenciónExistente.fecha_entrega = fecha;
                            }
                                BEDE.SubmitChanges();
                                MessageBox.Show("Los cambios realizados en el registro\nse guardaron exitosamente.", "REGISTRO EDITADO.", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Limpiar();
                        }
                    }
                }
            }catch { MessageBox.Show("Ha ocurrido un error al intentar guardar la inforación de la atención.\nPor favor, revise los datos e intentelo nuevamente.\n(De Persistir el error, se recomienda reiniciar el programa.)", "ERROR AL INTENTAR GUARDAR.", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        }

        private void tbx_CodBuscar_TextChanged(object sender, EventArgs e)
        {
            if (tbx_BusquedaDato.Text.Length >= 3) { errorProvider1.Clear(); }
            if (tbx_BusquedaDato.Text == "")
            {
                dgv_AtencionLista.Rows.Clear();
                Llenar();
            }
        }

        private void tbx_AtencionMecanicoClave_TextChanged(object sender, EventArgs e)
        {
            tbx_AtencionMecanicoClave.Text = tbx_AtencionMecanicoClave.Text.Trim();
        }
    }
}
